在實際的應用程式開發中,我們經常需要將一些外部檔案與應用程式一起發布,例如預設的設定檔案、SQLite 資料庫、圖片資源、範本檔案,或是第三方的靜態資產。這些檔案不屬於編譯後的程式碼,但對應用程式的正常運作卻是不可或缺的。Tauri 提供了強大的資源同梱機制,讓我們能夠輕鬆地將這些外部檔案整合到最終的安裝包中。
資源檔案的處理是桌面應用程式開發中的常見需求。想像一個文字編輯器需要預設的範本檔案,或是一個遊戲需要音效檔案和圖片資源,這些檔案都必須隨著應用程式一起發布給使用者。傳統的做法可能需要複雜的安裝腳本或是手動複製檔案,但 Tauri 的資源系統讓這個過程變得簡單且可靠。
透過 Tauri 的資源機制,我們可以確保這些檔案在應用程式安裝時就被正確放置,並且在執行期能夠可靠地存取到它們,而不用擔心路徑問題或是檔案遺失的狀況。
在 tauri.conf.json
中,我們可以透過 bundle.resources
欄位來指定要包含的檔案或目錄:
{
"bundle": {
"active": true,
"targets": "all",
"resources": [
"assets/config.json",
"assets/database.db",
"assets/templates/*",
"../public/sample.txt"
]
}
}
這個設定支援多種路徑格式。單一檔案可以直接指定路徑,使用 *
可以包含目錄下的所有檔案,而 **/*
則會遞迴包含所有子目錄的內容。路徑是相對於專案根目錄的,所以要確保檔案確實存在於指定的位置。
打包並安裝之後,這些資源就會被放在 $RESOURCE
資料夾中 (維持相同資料夾架構),不同平台對應的 $RESOURCE
位置不同,詳細可以參考這裡。
當資源檔案被打包後,我們需要在執行期正確地存取它們。Tauri 提供了專門的 API 來解析資源檔案的路徑:
import { ref, onMounted } from 'vue'
import { resolveResource } from '@tauri-apps/api/path'
import { readTextFile } from '@tauri-apps/api/fs'
const appConfig = ref(null)
onMounted(async () => {
try {
// 解析資源檔案的實際路徑
const configPath = await resolveResource('assets/config.json')
// 讀取檔案內容
const configData = await readTextFile(configPath)
const config = JSON.parse(configData)
console.log('載入的設定:', config)
appConfig.value = config
} catch (error) {
console.error('無法載入設定檔:', error)
}
})
需要注意的是,只要
resolveResource()
內的參數與當初在tauri.conf.json
的resources
設定的一樣,就可以拿到對應檔案,我們不需要再去處理它在使用者的電腦中的哪一個位置。
在 Rust 後端,我們也可以使用相應的 API 來存取資源:
use tauri::path::BaseDirectory;
use std::fs;
#[tauri::command]
fn load_config(handle: tauri::AppHandle) -> Result<String, String> {
// 解析資源檔案路徑
let resource_path = handle.path()
.resolve("assets/config.json", BaseDirectory::Resource)
.map_err(|e| e.to_string())?;
// 讀取檔案內容
let content = fs::read_to_string(resource_path)
.map_err(|e| e.to_string())?;
Ok(content)
}
讓我們以一個實際的例子來說明:假設我們正在開發一個筆記應用程式,需要包含預設的範本檔案。我們可以在專案中建立 assets/templates/
目錄,放入各種筆記範本,然後在設定中包含這些檔案。
應用程式啟動時,可以載入這些範本並提供給使用者選擇。這樣的設計不僅讓應用程式更加完整,也提供了更好的使用者體驗。使用者如果想要修改範本,或是新增新的範本 (e.g. 從網路上下載),可以直接自行修改或新增檔案。
Tauri 的資源同梱機制為桌面應用程式的檔案管理提供了優雅的解決方案。透過簡單的設定,我們就能將必要的外部檔案與應用程式一同打包發布,並在執行期透過統一的 API 來存取這些資源。這不僅簡化了部署流程,也確保了檔案的可靠性和可維護性。無論是設定檔、資料庫、範本或是其他靜態資源,都能透過這個機制來妥善管理,為使用者提供完整而穩定的應用程式體驗。